import {getToken, setToken, removeToken} from '@/utils/auth.js'
import {login, getUserInfo} from '@/api/user'
// 引入静态路由+引入重置路由器的方法
import { constantRoutes, resetRouter } from '@/router'

const actions = {
  async login(context, value) {
    // 向服务器发送请求，调用登录接口
     const token = await login(value)
    // 返回一个token，传给mutations
    context.commit('SET_TOKEN', token)
  },
  // 进入主页有token的情况下，获取用户资料
   async getUserInfo(context, value) {
     // 向服务器发送请求，调用获取用户资料的接口
     const userInfo = await getUserInfo()
     context.commit('SET_USER_INFO', userInfo)
     // 把获取的用户资料通过成功的promise返回给全局前置路由守卫中的dispatch调用，便于拿到里面的用户权限对象
     return userInfo
  },
  // 退出操作
  logout(context,value) {
    // 清除token
    context.commit('REMOVE_TOKEN')
    // 修改用户信息数据为空对象
    context.commit('SET_USER_INFO', {})
    // 重置路由器，新的路由器替换旧的路由器，新路由器里的路由配置是初始值：即全是静态路由
    resetRouter()
  }
}


const mutations = {
  'SET_TOKEN'(state, value) {
    // 修改state 中的token值
    state.token = value
    // 修改后的token值同步到缓存cookie
    setToken(value)
  },
  // 退出登录时移除token
  'REMOVE_TOKEN'(state) {
    // 移除state里的token
    state.token = null
    // 移除cookie里的token
    removeToken()
  },
  'SET_USER_INFO'(state, value) {
    // 修改state 中的userInfo值
    state.userInfo = value
  },
  // 修改路由配置的行为
  'SET_ROUTES'(state, value) {
    // 这里传递进来的value参数是筛选后的 有页面路由权限点 的动态路由 的数组
    state.routes = [...constantRoutes, ...value]
  }
}


const state = {
  // 从缓存cookie里读初始值
  token: getToken(),
  // 用户个人信息
  userInfo: {},
  // 路由配置信息，初始值为静态路由配置
  routes: constantRoutes
}

export default {
  namespaced: true,
  actions,
  mutations,
  state
}